#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Lectura.h"
#include "ListaAlumno.h"
#include "Alumno.h"
#include "HashALU.h"
#include "Fecha.h"
#include "ListaFiesta.h"
#include "HashESP.h"
#include "HashFIE.h"

#define FIESTA "Fiesta.txt"
#define ALUMNO "Alumno.txt"
#define ESPECIALIDAD "Especialidad.txt"
#define ASISTENCIA "Asistencia.txt"

#define FACULTAD "Facultad.txt"
#define INTERES "_Interes.txt"
#define REPORTE "_Reporte.txt"

void lecturaArchivo_Alumno(ListaAlumno* L,HashESP* hash,HashALU* hashALU){
    FILE *archAlumno;
    int codigo;
    char codChar[100];
    char nombre[100];
    int codEsp;
    char fecha[11];
    Alumno *alumno;


    if(archAlumno=fopen(ALUMNO,"r")){
        while(fgets(nombre,100,archAlumno)){
            
            //extraer codigo alumno
            quitar_espacio_final(nombre);
            extraerCadena_Izquierda(nombre,codChar,9);
            quitar_espacio_final(codChar);
            codigo=atoi(codChar);
            
            //extraer fecha
            extraerCadena_Derecha(nombre,fecha,10);
            quitar_espacio_final(nombre);
            
            //extraer codigo especialidad
            extraerCadena_Derecha(nombre,codChar,3);
            codEsp=atoi(codChar);
            
            //extraer nombre alumno
            quitar_espacio_final(nombre);
            
            alumno = nuevo_Alumno(codigo,nombre,codEsp,fecha,hash);
            inserta_HashALU(hashALU,alumno);
            insertarFinal_ListaAlumno(L,alumno);
        }
        L->fin_arch = L->fin; //el ultimo alumno leido marca el fin_arch
        fclose(archAlumno);
    } 
    
}

void lecturaArchivo_Fiesta(ListaFiesta* L, HashFIE *hashFIE){
    FILE* archFiesta;
    int codigo;
    char codChar[100];
    char nombre[100];
    float costo;
    char fecha[100];
    Fiesta* fiesta;


    if(archFiesta=fopen(FIESTA,"r")){
        while(fgets(nombre,100,archFiesta)){
            //codigo fiesta
            quitar_espacio_final(nombre);
            extraerCadena_Izquierda(nombre,codChar,4);
            quitar_espacio_final(codChar);
            codigo=atoi(codChar);
            
            //fecha
            extraerCadena_Derecha(nombre,fecha,10);
            quitar_espacio_final(nombre);
            
            //costo
            extraerCadena_DerechaAntesEspacio(nombre,codChar);
            costo=atof(codChar);
            
            //nombre
            quitar_espacio_final(nombre);
            
            fiesta = nueva_Fiesta(codigo,nombre,costo,fecha);
            inserta_HashFIE(hashFIE,fiesta);
            insertarFinal_ListaFiesta(L,fiesta);
        }
        L->fin_arch = L->fin;
        fclose(archFiesta);
    } 
    
}

void lecturaArchivo_Especialidad(ListaEspecialidad* L, HashESP* hashEsp){
    FILE* archEspecialidad;
    int codigo;
    char nombre[100];
    if(archEspecialidad=fopen(ESPECIALIDAD,"r")){
        while(fscanf(archEspecialidad,"%d",&codigo)!= EOF){
            fgetc(archEspecialidad);
            fgets(nombre,100,archEspecialidad);
            quitar_espacio_final(nombre);
            Especialidad* especialiad = nueva_Especialidad(codigo,nombre);
            inserta_HashESP(hashEsp,especialiad);
            insertarFinal_ListaEspecialidad(L,especialiad);
        }
        fclose(archEspecialidad);
    }
}

void lecturaArchivo_Interes(ListaFiesta* L, HashALU* hA){
    FILE* archInteres;
    int codigoFiesta;
    int codigoAlumno;
    Fiesta* fiesta;
    Alumno* alumno;
    char nomArch[20];
    NodoListaFiesta* i;
    for (i=L->ini; i != NULL;i = i->sig){
        sprintf(nomArch,"%03d",i->fiesta->codigo);
        strcat(nomArch,INTERES);
        fiesta = i->fiesta;
        if (archInteres = fopen(nomArch,"r")){
            while(fscanf(archInteres,"%d",&codigoAlumno)!= EOF){
                alumno = buscar_HashALU(hA,codigoAlumno);
                encolar_ColaAlumno(fiesta->interes,alumno);
            }
            fclose(archInteres);
        }
    }
}

void lecturaArchivo_Asistencia(HashALU* hashAlumno, HashFIE* hashFiesta){
    FILE* archAsistencia;
    int codigoFiesta;
    int codigoAlumno;
    Fiesta* fiesta;
    Alumno* alumno;
    if(archAsistencia=fopen(ASISTENCIA,"r")){
        while(fscanf(archAsistencia,"%d",&codigoFiesta)!= EOF){
            fscanf(archAsistencia,"%d",&codigoAlumno);
            fiesta=buscar_HashFIE(hashFiesta,codigoFiesta);
            alumno=buscar_HashALU(hashAlumno,codigoAlumno);
            insertarFinal_ListaAlumno(fiesta->asistencia,alumno);
        }
        fclose(archAsistencia);
    }
}


void extraerCadena_DerechaAntesEspacio(char *palabra, char *palabrita){
    int i,j,k;
    int l = strlen(palabra);
    for (i=l-1,j=0; palabra[i] != ' '; i--,j++)	{
        palabrita[j] = palabra[i];
    }
	
    palabra[l-j] = NULL;
    palabrita[j] = NULL;
    palabrita=strrev(palabrita); 
}
void quitar_espacio_final(char* cadena){
    cadena[strlen(cadena)-1]=NULL;
}

void extraerCadena_Derecha(char *palabra, char *palabrita, int num){
	int i,j;
	int l = strlen(palabra);
	for (i=l-num,j=0; i<l; i++,j++)	{
            palabrita[j] = palabra[i];
           // memcpy(palabrita[j],palabra[i],sizeof(char));
	} 
	palabra[l-num] = NULL;
	palabrita[j] = NULL;
}
void extraerCadena_Izquierda(char *palabra, char *palabrita, int num){
    char aux[100];
    extraerCadena_Derecha(palabra,palabrita,strlen(palabra)-num);
    strcpy(aux,palabrita);
    strcpy(palabrita,palabra);
    strcpy(palabra,aux);
}
